package algo_lignes_sites.params.objects.contraintesgeom;

import commons.data.category.Category;
import java.util.HashMap;


public class ContrainteGeomNode {

	
//	public static double defaultZS;
//	public static double defaultZC;
//	public static double defaultZIT;
//	public static double defaultZIN;

	
	public String name;
	public Category categoryNode;
	public double diametre_papier_mm;
	public double espaceAutour_papier_mm;
	public double zs; // x rayonNode
	public double zc; // x rayonNode
	public double zit; // x rayonNode
	public double zin; // x ZIT

	public ContrainteGeomNode(Category categoryNode, double diametre_papier_mm, double espaceAutour_papier_mm, double zs, double zc, double zit, double zin) {
		this.categoryNode = categoryNode;
		this.name = categoryNode==null ? "" : categoryNode.toString();
		this.diametre_papier_mm = diametre_papier_mm;
		this.espaceAutour_papier_mm = espaceAutour_papier_mm;
		this.zs = zs;
		this.zc = zc;
		this.zit = zit;
		this.zin = zin;
	}

	@Override
	public String toString() {
		return name + " -> diam. = " + diametre_papier_mm + " , espace = "  + espaceAutour_papier_mm + " , zone simplif : " + zs + " x rayon , zone connexité : " + zc + " x rayon , ZIT : " + zit + " , ZIN : " + zin;
	}
	
	// Crée une nouvelle contrainte geom, a partir de cgn1 et en ecrasant avec les valeurs de cgn2 quand elles sont renseignées (<> Nan)
	static public ContrainteGeomNode createContrainteGeomNode(ContrainteGeomNode cgn1, ContrainteGeomNode cgn2) {
		// Cas particulier
		if (cgn1 == null)
			return cgn2;
		
		// On part de cgn1
		ContrainteGeomNode cgn_new = new ContrainteGeomNode(cgn1.categoryNode, cgn1.diametre_papier_mm, cgn1.espaceAutour_papier_mm, cgn1.zs, cgn1.zit, cgn1.zs, cgn1.zin);
		
		// Puis on ajoute les données de cgn2 si elles sont non Nan
		cgn_new.categoryNode = null; // la notion de categorie n'a plus de sens, elle n'est utiles que pour les CGN initiales, celles du tableau de paramètres utilisateur
		cgn_new.name = cgn1.name + " / " + cgn2.name;
		if (!Double.isNaN(cgn2.diametre_papier_mm)) cgn_new.diametre_papier_mm = cgn2.diametre_papier_mm;
		if (!Double.isNaN(cgn2.espaceAutour_papier_mm)) cgn_new.espaceAutour_papier_mm = cgn2.espaceAutour_papier_mm;
		if (!Double.isNaN(cgn2.zs)) cgn_new.zs = cgn2.zs;
		if (!Double.isNaN(cgn2.zc)) cgn_new.zc = cgn2.zc;
		if (!Double.isNaN(cgn2.zit)) cgn_new.zit = cgn2.zit;
		if (!Double.isNaN(cgn2.zin)) cgn_new.zin = cgn2.zin;
		
		// a present, pour ne pas créer trop d'objet ContrainteGeomNode qui seront stockés dans les node
		// on gère un cache
		return getCGN_ifDejaCree(cgn_new);
	}

	public String isFullyFilled() {
		String err = "";
		if (Double.isNaN(diametre_papier_mm)) err += "diametre , ";
		if (Double.isNaN(espaceAutour_papier_mm)) err += "espace , ";
		if (Double.isNaN(zs)) err += "zs , ";
		if (Double.isNaN(zc)) err += "zc , ";
		if (Double.isNaN(zit)) err += "zit , ";
		if (Double.isNaN(zin)) err += "zin , ";
		return err;
	}
	
	// Gestion d'un cache de ContrainteGeomNode
	private static HashMap<String, ContrainteGeomNode> cache;
	private static ContrainteGeomNode getCGN_ifDejaCree(ContrainteGeomNode cgn) {
		if (cache==null)
			cache = new HashMap<String, ContrainteGeomNode>();
		String hash = cgn.getHash();
		if (cache.containsKey(hash))
			return cache.get(hash);
		cache.put(hash, cgn);
		return cgn;
	}
	private String getHash() {
		return "" + categoryNode + "_" + diametre_papier_mm + "_" + espaceAutour_papier_mm + "_" + zs + "_" + zc + "_" + zit + "_" + zin;
	}
	
}
